package cn.handong.tool.algorithm.多线程;

import java.util.ArrayDeque;
import java.util.Queue;

/**
*	这个题主要考察的是锁的概念  公平锁
*	并发用的关键字 volatile
*/
public class TestLock {
	//利用队列来实现公平锁
	private Queue<String> threadQueue=new ArrayDeque<>();
	//使用volatile 修饰 确保线程调用前数据被更新了，记录当前拿到锁的线程
	private volatile String turn;
	
	//排队
	public void addQueue(Thread thread){
		threadQueue.offer(thread.getName());
	}
	
	//拿锁方法
	public void lock(){
		Thread currentThread = Thread.currentThread(); //获取当前线程的引用
		turn=threadQueue.peek();//获取排在第一个
		
		while(!turn.equals(currentThread.getName()));//如果当前线程不是排在第一个的线程  循环阻塞
		
	}
	
	public void unLock(){
		threadQueue.poll(); //删除第一个
		turn=threadQueue.peek(); //更新第一个
	}
	
	
	public static void main(String[] args) {
		TestLock lock=new TestLock();
		//循环10次
		for(int i=0;i<10;i++){
			
			//创建ABC三个线程
			Thread A=new Thread(()->{
				lock.lock();
				System.out.print("A");
				lock.unLock();
			});
			Thread B=new Thread(()->{
				lock.lock();
				System.out.print("B");
				lock.unLock();
			});
			Thread C=new Thread(()->{
				lock.lock();
				System.out.println("C");
				lock.unLock();
			});
			//按顺序加入队列
			lock.addQueue(A);
			lock.addQueue(B);
			lock.addQueue(C);
			
			A.start();
			B.start();
			C.start();
		
		}
		
	}
	
}